from machine import PWM, Pin, ADC, I2C, UART  # 导入库
import icm20948, utime  # 导入icm20948库和utime库

imu = icm20948.ICM20948(I2C(0), gyro_scale=icm20948.DPS_2000, accel_scale=icm20948.GPM_8)  # 构造陀螺仪对象，设置角速度、加速度精度
pwm = PWM(0, Pin(7))  # 设置连接引脚，0是组号
pwm.init(freq=256, duty=0)  # 对于声音来说，震动的频率(freq)决定音调，占空比(duty)决定声音的响度。
adc_pin = ADC(Pin(5))  # 设置ADC引脚，例如A0引脚
uart = UART(1, baudrate=9600, tx=Pin(0), rx=Pin(1))

pwm.duty(95)
pwm.freq(1048)
pwm.duty(0)

def read_distance():
    uart.write(b'\x55')
    utime.sleep_ms(200)
    data = uart.read(2)
    if data and len(data) == 2:
        high_byte = data[0]
        low_byte = data[1]
        distance = (high_byte << 8) + low_byte
        return distance
    return None

while True:
    if imu.dataupdate() and imu.dataready():  # 如果陀螺仪数据已经被更新，并且已经准备好了以后才能读取数据。
        distance = read_distance()
        if imu.acc_z() > 900 and distance > 200:  # 陀螺仪z轴加速度超出设定范围
            print('脱手落地')
            for i in range(2):
                pwm.duty(95)  # 设置占空比
                pwm.freq(1048)  # 设置频率
                utime.sleep(2)
                pwm.duty(0)
                utime.sleep(2)
            utime.sleep(2)  # 增加延迟等待下一次检测
        else:
            sensor_value = adc_pin.read()
            if sensor_value > 120:
                distance = read_distance()
                print('距离: {} mm'.format(distance))
                if distance < 230:  # 直接使用distance进行数值比较
                    print('障碍')
                    for i in range(3):
                        pwm.duty(95) 
                        pwm.freq(1048)
                        utime.sleep(1)
                        pwm.duty(0)
                        utime.sleep(1)
                    utime.sleep(4)  # 增加延迟等待下一次检测
                elif 500 < distance < 800:  # 直接使用distance进行数值比较
                    print('下楼台阶')
                    pwm.duty(95)
                    pwm.freq(1048)
                    utime.sleep(5)
                    pwm.duty(0)
                    utime.sleep(5)  # 增加延迟等待下一次检测
                else:
                    print('正常行走')